/*
 * @Author: 鱿鱼溪学院
 * @Date: 2025-11-07 22:54:14
 * @LastEditTime: 2025-11-08 14:26:28
 * @LastEditors: 鱿鱼溪学院
 * @Description:
 * @FilePath: \jmd-ser-ts\index.ts
 * Copyright 鱿鱼溪学院 by edu v1.0
 * 天道酬勤
 */
// 首先加载环境变量
import 'dotenv/config'

// 然后导入其他模块
import Koa from 'koa'
import router from './app/router'
import defaultConfig from './config/config.default'
// 已安装 @types/koa-bodyparser，提供完整的TypeScript类型支持
import bodyParser from 'koa-bodyparser'
import { initSequelize, getSequelize } from './app/db/sequelize'
import { User } from './app/model'
import { ErrorHandler } from './app/exception'

const app = new Koa()

// 注册错误处理中间件（应在其他中间件之前注册）
app.use(ErrorHandler.handleError)

// 注册健康检查中间件（应该在路由之前注册）
app.use(ErrorHandler.healthCheck)

// 注册请求体解析中间件
app.use(bodyParser())

// 注册路由中间件
app.use(router.routes())
app.use(router.allowedMethods())

// 注册404处理中间件（应该在路由之后注册，只有当路由没有匹配时才处理）
app.use(ErrorHandler.handleNotFound)

// 启动服务器
async function startServer() {
  try {
    // 初始化Sequelize连接
    await initSequelize()

    // 注册数据库模型
    const sequelizeInstance = getSequelize()
    sequelizeInstance.addModels([User])
    console.log('数据库模型注册成功')

    // 启动HTTP服务器
    app.listen(defaultConfig.server.port, () => {
      console.log(
        `Server is running on http://localhost:${defaultConfig.server.port}`
      )
      console.log(`Environment: ${defaultConfig.environment}`)
    })
  } catch (error) {
    console.error('服务器启动失败:', error)
    process.exit(1)
  }
}

// 启动服务器
startServer()
